/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package produto;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;
import produto.ProdutoNaoCadastradoException;

/**
 *Persistência da classe Produto
 *
 * @author Alberto
 */
public class RepositorioProduto implements IRepositorioProduto {

    public RepositorioProduto() throws ErroAcessoRepositorioException {
    }
    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";
    private static final String EXISTE_POR_NOTA = "FROM Produto WHERE nota_produto = :nota_produto";

    /**
     * Metodo que ira cadastrar o Produto
     *
     * @param Produto objProduto
     * @return void
     */
    public void cadastrarAtualizar(Produto objProduto) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            t.begin();

            // Salvando o produto no banco
            s.saveOrUpdate(objProduto);

            // Comtando tudo caso der certo
            t.commit();
        } catch (Exception e) {
            t.rollback();
            // this.objSession.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Metodo que ira produrar o Produto
     *
     * @param int idProduto
     * @return void
     */
    public Produto procurar(int idProduto) throws ProdutoNaoCadastradoException {
        Produto p = null;
        if (this.existe(idProduto)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                t.begin();

                // Salvando o produto no banco
                p = (Produto) s.get(Produto.class, idProduto);
                // Comtando tudo caso der certo
                t.commit();
            } catch (Exception e) {
                t.rollback();
                
                throw new ProdutoNaoCadastradoException();
            }
        } else {
            throw new ProdutoNaoCadastradoException("Produto Não Cadastrado");
        }

        return p;

    }

    /**
     * Metodo que ira verificar a existência do Produto
     *
     * @param int idProduto
     * @return void
     */
    public boolean existe(int idProduto) {
        Produto p = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            t.begin();
            // Salvando o produto no banco
            p = (Produto) s.get(Produto.class, idProduto);
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();

        }
        return (p != null);
    }

    /**
     * Metodo que ira listar os Produtos
     *
     * @return Collection
     */
    public List<Produto> listar(String strComplemento) throws Exception {
        List<Produto> listP = new ArrayList();
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            t.begin();
            
            // Salvando o produto no banco
            Query q = s.createQuery("from Produto  WHERE id_produto IS NOT NULL  " + strComplemento);
            
            // listando os produtos
            listP = q.list();

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
        }
        
        return listP;
    }

    /**
     * Método que ira remover o produto do banco
     *
     * @param idProduto
     */
    public void remover(int idProduto) throws ProdutoNaoCadastradoException {
        Produto p = null;
        if (this.existe(idProduto)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                t.begin();
                // Recupero o meu produto
                p = (Produto) s.get(Produto.class, idProduto);

                // Seto seu id como excluido
                p.getStatusProduto().setIdStatusProdutos(9);

                // Comtando tudo caso der certo
                t.commit();

            } catch (Exception e) {
                t.rollback();
            }
        } else {
            throw new ProdutoNaoCadastradoException("Produto Não Cadastrado");
        }
    }

    /**
     * Método que verifica se já existe um produto com a nota informada
     *
     * @param numeroNota
     * @return boolean
     */
    public boolean existePorNumeroNota(String numeroNota) {
        Produto p = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Criando a query
            p = (Produto) s.createQuery(EXISTE_POR_NOTA)
            .setParameter("nota_produto", numeroNota)
            .uniqueResult();
            
            // Comtando tudo caso der certo
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            
        }
        return (p != null);
    }
}
